package com.example.springbootjavafx.view;

import com.example.springbootjavafx.domain.User;
import com.example.springbootjavafx.util.DialogHelper;
import de.saxsys.mvvmfx.*;
import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.Parent;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.control.TableView;
import javafx.scene.control.TextField;
import javafx.stage.Stage;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;

import java.net.URL;
import java.util.ResourceBundle;

/**
 * ListView 类实现了 FxmlView 接口，并特定于 ListViewModel 模型。
 * 该类是一个组件，负责显示用户列表的界面。
 */
@Component
@Slf4j
public class ListView implements FxmlView<ListViewModel> , Initializable {

    /**
     * 通过 FXML 标记，将 TableView 绑定到 UI，用于显示用户列表。
     */
    @FXML
    public TableView<User> tableView;
    @FXML
    public Label idLabel,nameLabel,addressLabel;

    @FXML
    public Button addButton,actionEdit,delButton,searchButton;
    public TextField username;

    private Stage primaryStage;

    /**
     * 通过 InjectViewModel 注解，将 ListViewModel 注入到类中。
     * 这使得我们可以直接访问模型中的数据和方法，以便更新界面。
     */
    @InjectViewModel
    private ListViewModel listViewModel;

    /**
     * 初始化视图控制器的方法，在 UI 加载后调用。
     * 此方法将视图（tableView）的数据源设置为模型（listViewModel）中的用户列表。
     *
     * @param url 初始化参数，通常不需要使用。
     * @param resourceBundle 初始化参数，提供本地化资源，通常不需要使用。
     */
    @Override
    public void initialize(URL url, ResourceBundle resourceBundle) {
        // 初始化时，将用户列表绑定到 TableView 上
//        log.info("--------------------------> userList:{}", listViewModel.getUserList());
        tableView.setItems(listViewModel.getUserList());


        idLabel.textProperty().bind(listViewModel.idLabelTextProperty());
        nameLabel.textProperty().bind(listViewModel.nameLabelTextProperty());
        addressLabel.textProperty().bind(listViewModel.addressLabelTextProperty());
        //查询字段绑定
        username.textProperty().bindBidirectional(listViewModel.usernameTextProperty());

        // 监听TableView的选中项目变化
        tableView.getSelectionModel().selectedItemProperty().addListener((observable, oldValue, newValue) -> {
            // 当选中项目改变时，更新列表视图模型中的相关信息
            listViewModel.idLabelTextProperty().set(newValue==null?"":newValue.getId());
            listViewModel.nameLabelTextProperty().set(newValue==null?"":newValue.getName());
            listViewModel.addressLabelTextProperty().set(newValue==null?"":newValue.getAddress());
        });

        // 禁用actionEdit动作的属性绑定到tableView选中项的属性上
        // 当tableView没有选中任何项时，actionEdit将被禁用
        actionEdit.disableProperty().bind(tableView.getSelectionModel().selectedItemProperty().isNull());
        delButton.disableProperty().bind(tableView.getSelectionModel().selectedItemProperty().isNull());

        // 订阅名为"saveUser"的事件，当该事件发生时，执行对应的Lambda表达式
        listViewModel.userDetailScope.subscribe("saveUser", (key, value) -> {
            listViewModel.initialize();
//            this.tableView.refresh();
        });


    }


    @FXML
    public void onEditClick(ActionEvent actionEvent) {


        listViewModel.userDetailScope.setSelectedUser(tableView.getSelectionModel().getSelectedItem());// 设置选中用户
        ViewTuple<EditView, EditViewModel> load = FluentViewLoader
                .fxmlView(EditView.class)
                .providedScopes(listViewModel.userDetailScope)// 注入用户详情作用域
                .load();
        Parent view = load.getView();
        Stage showDialog = DialogHelper.showDialog(view, primaryStage);
        load.getCodeBehind().setDisplayingStage(showDialog);

    }

    public void onAddClick(ActionEvent actionEvent) {

        listViewModel.userDetailScope.clear();
        ViewTuple<AddView, AddViewModel> load = FluentViewLoader
                .fxmlView(AddView.class)
                .providedScopes(listViewModel.userDetailScope)// 注入用户详情作用域
                .load();
        Parent view = load.getView();
        Stage showDialog = DialogHelper.showDialog(view, primaryStage);
        load.getCodeBehind().setDisplayingStage(showDialog);
    }


    public void onDelClick(ActionEvent actionEvent) {
        listViewModel.deleteUser();
        listViewModel.initialize();
    }

    public void onSearchClick(ActionEvent actionEvent) {

        listViewModel.searchUser();
    }
}
